<?php

App::uses("String", "Utility");    

class UsersController extends AppController {
    // var $helpers = array ('Html','Form');
    var $name = 'Users'; // riferimento alla cartella delle view

    // questa riga permette di utilizzare il componente Permission
    var $components = array('Permission'); 
        

    public function beforeFilter(){
    	
		parent::beforeFilter();
		
        // don't require logging in for login and logout actions
        $this->Auth->allow('login','logout','register','saveRegistration','activate','password','changePassword');

    	Controller::loadModel('User');
		

    }

	public function beforeRender(){
		if(isset($this->viewVars['users'])){
			foreach ($this->viewVars['users'] as $chiave=>$user) {
				$ret = User::$STATO[$user['User']['stato']];
				$this->viewVars['users'][$chiave]['User']['stato']=$ret;
			}
		}
	}

    
    public function index() {
    		
    	Controller::loadModel('Group');
		$groups = $this->Group->find('list', array('fields' => array('Group.ID', 'Group.descrizione'))	);
		$this->set('groups',$groups);

    	$sessionConditions = $this->Session->read("conditions");

    	$this->set("bootstrap_form_ricerca","bootstrap_form_ricerca_utenti");

		
    	//la classe User è stata già istanziata dal controller perche abbiamo seguito le regole di denominazione di cake
		if (isset($sessionConditions['users']) && !empty($sessionConditions['users'])) {
	        $this->set('users', $this->User->find('all', array('conditions' => $sessionConditions['users'], 'recursive' => 1)));
		} else {
    	    $this->set('users', $this->User->find('all', array('recursive' => 0)));
		}
    }
	
    public function add() {
    	
    	Controller::loadModel('Group');
		$groups = $this->Group->find('list', array('fields' => array('Group.ID', 'Group.descrizione'))	);
		$this->set('groups',$groups);
		$this->set("stati", User::$STATO);

    }

    public function edit($id) {

    	Controller::loadModel('Group');
		$groups = $this->Group->find('list', array('fields' => array('Group.ID', 'Group.descrizione'))	);
		$this->set('groups',$groups);
		$this->set("stati", User::$STATO);

    	Controller::loadModel('Comune');
		$comuni = $this->Comune->find('all',  array('fields' => array('Comune.id', 'Comune.provincia_id', 'Comune.descrizione'), 'recursive' => 0));
		$this->set('comuni',$comuni);
		// print_r($comuni);die;
    	
		$this->User->id = $id;
		$this->set('user', $this->User->read());

    }

    public function save() {
    	// print_r($this->request->data);die;
    	//TODO gestione delle validazioni
		// if ($this->User->validates()) {
		    // it validated logic
		    $ds = $this->User->getDataSource();
			$ds->begin();
		    try {
			    Controller::loadModel('Anagrafica');
			    $this->Anagrafica->save($this->request->data);
				$this->User->set("anagrafica_id",$this->Anagrafica->id);
				$this->User->setUtente($this->Auth->user());
				if (!isset($this->request->data["User"]["id"]) || empty($this->request->data["User"]["id"])) {
					$key = $this->generate_key();
					$this->User->set("registrazione", $key);
					$this->User->set("password", $this->Auth->password($key));
					$this->User->set("email", $this->request->data["User"]["username"]);
				}
				// print_r($this->data);
				// print_r($this->request->data);
				$this->User->set($this->request->data);
				$this->validateModel();
				$this->User->save();
				// array_filter mi permette di non prendere in considerazione valori vuoti
				// $this->User->save(array_filter($this->request->data));
				$ds->commit();
				$this->Session->setFlash(__("Utente aggiornato."));
				
		    } catch (exception $e) {
		    	if (isset($ds)) {
		    		$ds->rollback();
		    	}
		    	CakeLog::error($e->getMessage());
				$this->Session->setFlash(__("Utente non aggiornato:"). $e->getMessage(),null,null,LOG_ERR);
		    }
		// } else {
		    // // didn't validate logic
		    // $errors = $this->ModelName->validationErrors;
			// $this->Session->setFlash("Errore in fase di validazione: ".$errors,null,null,"error");
		// }

		if (isset($this->User->id)) {
			$this->redirect("/Users/edit/".$this->User->id);
		} else {
			$this->redirect($this->referer());
		}
    }

	private function validateModel() {
		if(!$this->User->validates()) {
			throw new Exception(serialize($this->User->validationErrors));
		}
	}

    public function password() {
    	$user = $this->Auth->user();
		$this->set("user",$user);
    }

    public function changePassword() {
    	try {
			if (!empty($this->request->data["password"]) && $this->request->data["password"]==$this->request->data["verifica_password"]) {
				$this->User->set("password", $this->Auth->password($this->request->data["password"]));
				$this->validateModel();
				$this->User->save($this->request->data);
				$this->Session->setFlash(__("Password aggiornata correttamente."));
			} else {
				$this->Session->setFlash(__("Le password inserite non coincidono."),null,null,LOG_ERR);
				$this->redirect($this->referer());
			}
		} catch (exception $e) {
				$this->Session->setFlash($e->getMessage(),null,null,LOG_ERROR);
		}
			
    }
	
    
    public function delete($id='') {
		if ($id=='')
			$id = $this->request->data['id'];
		$this->User->delete($id);
		$this->Session->setFlash('Utente cancellato.');
		$this->redirect("/Users");
    }

	private function generate_key() { 
	 $salt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
	 srand((double)microtime()*1000000); 
	 $id = ""; 
	//generates random 6 character id  
	  for($count = 0; $count < 6; $count++) 
	 { 
	    $num = rand(1,33); // % 33; 
	    // CakeLog::debug("numero random da 1 a 33: ".$num);
	    $tmp = substr($salt, $num, 1); 
	    // CakeLog::debug("carattere: ".$tmp);
	    $id = $id.$tmp; 
	    // CakeLog::debug("id: ".$id);
	  } 
	  // CakeLog::debug("codice generato: ".$id);
	  return $id; 
	}
	
	public function register() {

				// verifico il gruppo configurato sui parametri, in caso contrario restituisco un warning
			    Controller::loadModel('Parametro');
				$this->Parametro->set("codice","gruppo_registrazione");
				$this->Parametro->read();
				$gruppoRegistrazione = $this->Parametro->field("valore");
				if (empty($gruppoRegistrazione)) {
					$this->Session->setFlash(__("Attenzione! un parametro di configurazione non è stato correttamente impostato."),null,null,LOG_WARNING);
				}

	}
	
	public function saveRegistration() {
			$ds = $this->User->getDataSource();
			$ds->begin();
		    try {
			    Controller::loadModel('Anagrafica');
			    $this->Anagrafica->save($this->request->data);
				$key = $this->generate_key();
				$this->User->set("registrazione", $key);
				$this->User->set("password", $this->Auth->password($key));
				$this->User->set("anagrafica_id",$this->Anagrafica->id);
				$this->User->set("email",$this->request->data["User"]["username"]);
				// setto il gruppo configurato sui parametri, in caso contrario restituisco un warning
			    Controller::loadModel('Parametro');
				$this->Parametro->set("codice","gruppo_registrazione");
				$this->Parametro->read();
				$gruppoRegistrazione = $this->Parametro->field("valore");
				if (!empty($gruppoRegistrazione)) {
					$this->User->set("group_id",$gruppoRegistrazione);
				} else {
					$this->Session->setFlash(__("Attenzione! un parametro di configurazione non è stato correttamente impostato."),null,null,LOG_WARNING);
				}
				$this->User->set($this->request->data);
				$this->validateModel();
				$this->User->save();
				//invio email di attivazione
				$this->inviaEmailAttivazione();
				$ds->commit();
				$this->Session->setFlash(__("Registrazione eseguita! Attivare l'utente tramite in link inviato via email."));
		    } catch (exception $e) {
		    	if (isset($ds)) {
		    		$ds->rollback();
		    	}
		    	CakeLog::error($e->getMessage());
				$this->Session->setFlash(__("Registrazione fallita:"). $e->getMessage(),null,null,LOG_ERR);
		    }
			$this->redirect("/Home/wellcome");
	}
	
	private function inviaEmailAttivazione() {
		App::uses('CakeEmail', 'Network/Email');
		$this->email = new CakeEmail("gmail");
		// $to = str_replace(";", ",", $this->request->data['to'], $count);
		// $destinatari = explode(",", $to);
		// foreach ($destinatari as $key => $destinatario) {
			// $destinatari[$key]=trim($destinatario, " \t"); //elimino gli spazi e i tab su ogni indirizzo
		// }
		$this->email->to($this->User->field("email"));
		$this->email->subject("WonderSchool - attiva registrazione");
		$msg ="Per attivare l'utente vai su questa pagina: ".Router::url("/Users/activate/".$this->User->field("registrazione"),true);
		if (!$this->email->send($msg) ) {
			throw new Exception(__("Errore in fase di invio della mail di attivazione."));
        }
	}
	
	
	public function activate($key) {
		try {
			$conditions = array("User.stato" => "R", "User.registrazione" => $key);
			$ret = $this->User->find("first", array("conditions" => $conditions));
			if (!isset($ret) || empty($ret)) {
				throw new Exception(__("Attivazione già avvenuta o chiave d'attivazione errata."));
			}
			$this->User->set("id",$ret["User"]["id"]);
			$this->User->set("stato","A");
			// $this->validateModel();
			// nel salvataggio disabilito la validazione
			$this->User->save(null,FALSE);
			$this->Session->setFlash(__("Complimenti il tuo utente è stato attivato con successo. La chiave di attivazione è la tua attuale password."));
		} catch (exception $e) {
			$this->Session->setFlash(__("Errore in fase di attivazione:") . $e->getMessage(), null,null,LOG_ERR);
		}
		$this->redirect("/Home");
	}

	function login() {
	    //Auth Magic
	    if ($this->request->is('post')) {
	        if ($this->Auth->login()) {
	            // return $this->redirect($this->Auth->redirect()); // disabilitare se si vuole utilizzare il redirecr impostato su Auth
				// una volta effettuato il login inserisco in sessione le autorizzazioni ACL legate all'utente connesso.
				$this->Permission->setPermissionToSession();
				$utente = $this->Auth->user();
                //setto la data di accesso..
                $this->User->id=$utente["id"];
                $this->User->savefield("dt_accesso",date("Y-m-d H:i:s"));
				CakeLog::info(__("%s ha eseguito l'accesso.", $utente["username"]));
				$this->redirect($this->Auth->loginRedirect);
	        } else {
				CakeLog::warning("Username o password non corretti.");
	            $this->Session->setFlash(__('Username o password non corretti.'), 'default', array(), "warning");
	        }
	    }
	}
	

	function logout() {
	    // $this->redirect($this->Auth->logout()); // abilitare se si vuole utilizzare il redirect impostato sulll'oggetto Auth
		$utente = $this->Auth->user();
		CakeLog::info(__("%s ha eseguito il logout.", $utente["username"]));
		$this->Auth->logout();
		// eliminare dalla sessione le autorizzaizoni ACL legate all'utente.
		$this->Permission->clearPermissionfromSession();
		// se si è autorizzati a stare su questa pagine ok
	    $this->redirect($this->Auth->logout());
		// $this->redirect($this->referer());
	}


	public function ricerca() {
		
		foreach ($this->request->data as $key => $valore) {
			if(isset($this->request->data["conditions"]["users"]) && !empty($this->request->data["conditions"]["users"])) {
				$conditions = array();
				foreach ($this->request->data["conditions"]["users"] as $nomeFiltro => $valoreFiltro) {
					if (!empty($valoreFiltro)) {
						$conditions[$nomeFiltro]=$valoreFiltro;
					}
				}
				$sessionConditions = $this->Session->read("conditions");
				$sessionConditions["users"] = $conditions;
				$this->Session->write("conditions", $sessionConditions);
				break;
			}
		}
		$this->redirect("/Users");
				
	}

	public function rimuoviFiltri() {
		$conditions = $this->Session->read("conditions");
		if (isset($conditions["users"])) {
			unset($conditions["users"]);
		}
		$this->Session->write("conditions", $conditions);
		// print_r($conditions);die;
		$this->redirect("/Users");
	}
    
   
}
?>